package 两两交换链表中的节点;

public class Solution2 {

    public ListNode swapPairs(ListNode head) {

        ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
        dumyhead.next = head; // 将虚拟头结点指向head，这样方便后面做删除操作
        ListNode cur = dumyhead;
        // 临时节点，保存两个节点后面的节点
        ListNode temp;
        // 两个节点中的第一个节点
        ListNode firstNode;
        // 两个节点中的第二个节点
        ListNode secondNode;
        while ( cur.next != null && cur.next.next != null ){
            firstNode = cur.next;
            secondNode = firstNode.next;
            temp = secondNode.next;
            // 步骤一：虚拟头节点连接第二个节点
            cur.next = secondNode;
            // 步骤二：第二个节点连接前一个节点(第一个节点)
            secondNode.next = firstNode;
            // 步骤三:第一个节点连接 两个节点后面的节点
            firstNode.next = temp;
            // 更新虚拟头节点
            cur = firstNode;
        }
        return dumyhead.next;
    }
}
